home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 24
/
Amiga Format AFCD24 (Feb 1998, Issue 108).iso
/
-seriously_amiga-
/
shareware
/
programming
/
other
/
apic
/
examples
/
amikeyterm.lst
< prev
next >
Wrap
File List
|
1998-01-05
|
19KB
|
511 lines
#PIC V1.0 (c)1997 J.Petroglou LIST FILE
#file: dh2:IDE/APICforAMINET/APIC/examples/Amikeyterm.asm
#date: Sun Dec 14 20:41:45 1997
#pic : PIC16C84
#xtal: 4000000 Hz
ADDR CODE SRCLINE SOURCECODE
0000 000001
0000 000002
0000 000003 ;PIC16C84 keybord controller for Amiga keybords
0000 000004 ;pressed keys are located in table and send in serial ascii format (19200baud)
0000 000005 ;
0000 000006 ;Dirk Duesterberg duesterb@unixserv.rz.fh-hannover.de
0000 000007 ; http://linux.rz.fh-hannover.de/~duesterb
0000 000008
0000 000009
0000 000010 list p=PIC16C84, r=dec, s=on
0000 000011
0000 000012
0000 000013 device HS_OSC, WDT_OFF
0000 000014 xtal 4000000
0000 000015
0000 000016 PortA = 05h
0000 000017 PortB = 06h
0000 000018 pcl = 02h
0000 000019
0000 000020
0000 000021
0000 000022 #define ACLK PortA,0
0000 000023 #define ADAT PortA,1
0000 000024
0000 000025 #define TXD PortA,2
0000 000026 #define c 3,0
0000 000027 #define z 3,2
0000 000028
0000 000029 RA = 5 ;PortA is register 5
0000 000030
0000 000031
0000 000032
0000 000033
0000 000034 CBLOCK 0ch
0000 000035
0000 000035
0000 000036 count0
0000 000037 count1
0000 000038 Akeydat
0000 000039 serbuf
0000 000040
0000 000040
0000 000041 ENDC
0000 000042
0000 000043
0000 000044
0000 30FB 000045 movlw 11111011b ;pin 2 is output (TXD)
0001 0065 000046 tris PortA
0002 000047
0002 3000 000048 movlw 0 ;PortB is output
0003 0066 000049 tris PortB
0004 000050
0004 2888 000051 goto Reset
0005 000052
0005 000053
0005 000054
0005 080E 000055 rawkeys movf Akeydat,w
0006 397F 000056 andlw 7fh ;clr bit 7 (make/break or pressed/unpressed)
0007 0782 000057 addwf pcl,f
0008 000058
0008 000059
0008 000060 ; characters, numbers and spezial keys
0008 000061 ; $00-$3F
0008 000062
0008 3400 000063 retlw 00h ;00h
0009 3400 000064 retlw 00h ;01h
000A 3400 000065 retlw 00h ;02h
000B 3400 000066 retlw 00h ;03h
000C 3400 000067 retlw 00h ;04h
000D 3400 000068 retlw 00h ;05h
000E 3400 000069 retlw 00h ;06h
000F 3400 000070 retlw 00h ;07h
0010 000071
0010 3400 000072 retlw 00h ;08h
0011 3400 000073 retlw 00h ;09h
0012 3400 000074 retlw 00h ;0Ah
0013 3400 000075 retlw 00h ;0Bh
0014 3400 000076 retlw 00h ;0Ch
0015 3400 000077 retlw 00h ;0Dh
0016 3400 000078 retlw 00h ;0Eh
0017 3400 000079 retlw 00h ;0Fh
0018 000080
0018 000081
0018 000082
0018 3471 000083 retlw "q" ;10h
0019 3477 000084 retlw "w" ;11h
001A 3465 000085 retlw "e" ;12h
001B 3472 000086 retlw "r" ;13h
001C 3474 000087 retlw "t" ;14h
001D 347A 000088 retlw "z" ;15h
001E 3475 000089 retlw "u" ;16h
001F 3469 000090 retlw "i" ;17h
0020 000091
0020 346F 000092 retlw "o" ;18h
0021 3470 000093 retlw "p" ;19h
0022 FFFFFFFC 000094 retlw "ü" ;1Ah
0023 342B 000095 retlw "+" ;1Bh
0024 3400 000096 retlw 00h ;1Ch
0025 3400 000097 retlw 00h ;1Dh
0026 3400 000098 retlw 00h ;1Eh
0027 3400 000099 retlw 00h ;1Fh
0028 000100
0028 000101
0028 000102
0028 3461 000103 retlw "a" ;20h
0029 3473 000104 retlw "s" ;21h
002A 3464 000105 retlw "d" ;22h
002B 3466 000106 retlw "f" ;23h
002C 3467 000107 retlw "g" ;24h
002D 3468 000108 retlw "h" ;25h
002E 346A 000109 retlw "j" ;26h
002F 346B 000110 retlw "k" ;27h
0030 000111
0030 346C 000112 retlw "l" ;28h
0031 FFFFFFF6 000113 retlw "ö" ;29h
0032 FFFFFFE4 000114 retlw "ä" ;2Ah
0033 3400 000115 retlw 00h ;2Bh
0034 3400 000116 retlw 00h ;2Ch
0035 3400 000117 retlw 00h ;2Dh
0036 3400 000118 retlw 00h ;2Eh
0037 3400 000119 retlw 00h ;2Fh
0038 000120
0038 000121
0038 000122
0038 3400 000123 retlw 00h ;30h
0039 3400 000124 retlw 00h ;31h
003A 3400 000125 retlw 00h ;32h
003B 3400 000126 retlw 00h ;33h
003C 3400 000127 retlw 00h ;34h
003D 3400 000128 retlw 00h ;35h
003E 3400 000129 retlw 00h ;36h
003F 3400 000130 retlw 00h ;37h
0040 000131
0040 3400 000132 retlw 00h ;38h
0041 3400 000133 retlw 00h ;39h
0042 3400 000134 retlw 00h ;3Ah
0043 3400 000135 retlw 00h ;3Bh
0044 3400 000136 retlw 00h ;3Ch
0045 3400 000137 retlw 00h ;3Dh
0046 3400 000138 retlw 00h ;3Eh
0047 3400 000139 retlw 00h ;3Fh
0048 000140
0048 000141 ; other spezial keys (space, TAB, Return)
0048 000142 ; $40-$4F
0048 000143
0048 3400 000144 retlw 00h ;40h
0049 3400 000145 retlw 00h ;41h
004A 3400 000146 retlw 00h ;42h
004B 3400 000147 retlw 00h ;43h
004C 3400 000148 retlw 00h ;44h
004D 3400 000149 retlw 00h ;45h
004E 3400 000150 retlw 00h ;46h
004F 3400 000151 retlw 00h ;47h
0050 000152
0050 3400 000153 retlw 00h ;48h
0051 3400 000154 retlw 00h ;49h
0052 3400 000155 retlw 00h ;4Ah
0053 3400 000156 retlw 00h ;4Bh
0054 3400 000157 retlw 00h ;4Ch
0055 3400 000158 retlw 00h ;4Dh
0056 3400 000159 retlw 00h ;4Eh
0057 3400 000160 retlw 00h ;4Fh
0058 000161
0058 000162
0058 000163 ; Function keys, Help etc.
0058 000164 ; $50-$5F
0058 000165
0058 3400 000166 retlw 00h ;50h
0059 3400 000167 retlw 00h ;51h
005A 3400 000168 retlw 00h ;52h
005B 3400 000169 retlw 00h ;53h
005C 3400 000170 retlw 00h ;54h
005D 3400 000171 retlw 00h ;55h
005E 3400 000172 retlw 00h ;56h
005F 3400 000173 retlw 00h ;57h
0060 000174
0060 3400 000175 retlw 00h ;58h
0061 3400 000176 retlw 00h ;59h
0062 3400 000177 retlw 00h ;5Ah
0063 3400 000178 retlw 00h ;5Bh
0064 3400 000179 retlw 00h ;5Ch
0065 3400 000180 retlw 00h ;5Dh
0066 3400 000181 retlw 00h ;5Eh
0067 3400 000182 retlw 00h ;5Fh
0068 000183
0068 000184
0068 000185
0068 000186 ; shifting keys like shift, amiga, Alternate and Control
0068 000187 ; $60-6F
0068 000188
0068 3400 000189 retlw 00h ;60h
0069 3400 000190 retlw 00h ;61h
006A 3400 000191 retlw 00h ;62h
006B 3400 000192 retlw 00h ;63h
006C 3400 000193 retlw 00h ;64h
006D 3400 000194 retlw 00h ;65h
006E 3400 000195 retlw 00h ;66h
006F 3400 000196 retlw 00h ;67h
0070 000197
0070 3400 000198 retlw 00h ;68h
0071 3400 000199 retlw 00h ;69h
0072 3400 000200 retlw 00h ;6Ah
0073 3400 000201 retlw 00h ;6Bh
0074 3400 000202 retlw 00h ;6Ch
0075 3400 000203 retlw 00h ;6Dh
0076 3400 000204 retlw 00h ;6Eh
0077 3400 000205 retlw 00h ;6Fh
0078 000206
0078 000207
0078 000208 ;spezial keybord commandos
0078 000209 ; $70-$7F
0078 000210
0078 3400 000211 retlw 00h ;70h
0079 3400 000212 retlw 00h ;71h
007A 3400 000213 retlw 00h ;72h
007B 3400 000214 retlw 00h ;73h
007C 3400 000215 retlw 00h ;74h
007D 3400 000216 retlw 00h ;75h
007E 3400 000217 retlw 00h ;76h
007F 3400 000218 retlw 00h ;77h
0080 000219
0080 3400 000220 retlw 00h ;78h
0081 3400 000221 retlw 00h ;79h=F9h= letzter tasten code war fehlerhaft
0082 3400 000222 retlw 00h ;7Ah=FAh= tastenpuffer im keybord voll
0083 3400 000223 retlw 00h ;7Bh
0084 3400 000224 retlw 00h ;7Ch=FCh= selbsttest der tastatur war fehlerhaft
0085 3400 000225 retlw 00h ;7Dh=FDh= beginn der beim Einschalten gedrueckten Tasten
0086 3400 000226 retlw 00h ;7Eh=FEh= ende der beim Einschalten gedrueckten Tasten
0087 3400 000227 retlw 00h ;7Fh
0088 000228
0088 000229
0088 000230
0088 000231
0088 000232
0088 000233
0088 000234
0088 000235
0088 000236
0088 000237
0088 000238
0088 000239
0088 000240
0088 000241
0088 000242
0088 000243
0088 000244
0088 000245
0088 000246
0088 000247
0088 000248
0088 000249
0088 000250
0088 000251
0088 018E 000252 Reset clrf Akeydat ;Akeydat is used as character counter
0089 000253
0089 300B 000254 check movlw 11
008A 020E 000255 subwf Akeydat,w ;how many characters ?
008B 1903 000256 btfsc z
008C 289F 000257 goto ready
008D 000258
008D 2092 000259 call dat
008E 008F 000260 movwf serbuf
008F 20D6 000261 call sendb ;send letter
0090 0A8E 000262 incf Akeydat,f
0091 2889 000263 goto check
0092 000264
0092 000265
0092 000266
0092 080E 000267 dat movf Akeydat,w ;letter to w routine
0093 0782 000268 addwf pcl,f ;jump in table
0094 346D 000269 retlw "mache RESET"
0095 3461 000269
0096 3463 000269
0097 3468 000269
0098 3465 000269
0099 3420 000269
009A 3452 000269
009B 3445 000269
009C 3453 000269
009D 3445 000269
009E 3454 000269
009F 000270
009F 000271
009F 000272
009F 000273
009F 000274
009F 000275
009F 000276
009F 20B2 000277 ready call sync
00A0 000278
00A0 000279
00A0 000280
00A0 000281
00A0 3007 000282 rcADAT movlw 7
00A1 008C 000283 movwf count0
00A2 000284
00A2 20CD 000285 :loop call wACLK ;wait for Amiga CLK
00A3 0D8E 000286 rlf Akeydat,f ;rotate bits into register
00A4 0B8C 000287 decfsz count0,f
00A5 28A2 000288 goto :loop ;format is x6543210
00A6 000289
00A6 000290
00A6 0D8E 000291 rlf Akeydat,f ;format is 6543210x
00A7 20CD 000292 call wACLK ;wait for Amiga CLK
00A8 0C8E 000293 rrf Akeydat,f ;format is 76543210, jippije
00A9 098E 000294 comf Akeydat,f ;data is inverted
00AA 000295
00AA 3005 000296 movlw 5
00AB 20BA 000297 call wms ;wait 5 ms
00AC 000298
00AC 000299 ; mov serbuf,Akeydat
00AC 000300 ; call sendb ;send raw data
00AC 000301
00AC 000302
00AC 2005 000303 call rawkeys
00AD 008F 000304 movwf serbuf
00AE 000305
00AE 1F8E 000306 btfss Akeydat,7 ;no sending if key up flag is set
00AF 20D6 000307 call sendb ;send the in table found code
00B0 000308
00B0 20C3 000309 call AHshake ;all data OK, do the Handshake
00B1 28A0 000310 goto rcADAT ;receive next byte from keybord
00B2 000311
00B2 000312
00B2 000313
00B2 000314
00B2 000315
00B2 000316
00B2 000317
00B2 000318
00B2 000319
00B2 000320
00B2 000321
00B2 20CD 000322 sync call wACLK ;wait for clock and do no Acknowledge
00B3 000323
00B3 30FA 000324 movlw 250
00B4 20BA 000325 call wms ;wait 250 ms (we want the sync mode!)
00B5 000326
00B5 20CD 000327 call wACLK ;wait for Amiga CLK for Handshake
00B6 000328
00B6 3001 000329 movlw 1
00B7 20BA 000330 call wms ;wait 1 ms
00B8 000331
00B8 20C3 000332 call AHshake ;now we do the shake!
00B9 0008 000333 return
00BA 000334
00BA 000335
00BA 000336
00BA 000337
00BA 000338
00BA 000339
00BA 008C 000340 wms movwf count0
00BB 000341
00BB 30F8 000342 :loop movlw 248
00BC 008D 000343 movwf count1
00BD 0000 000344 :do_it nop
00BE 000345
00BE 0B8D 000346 decfsz count1,f
00BF 28BD 000347 goto :do_it
00C0 000348
00C0 0B8C 000349 decfsz count0,f
00C1 28BB 000350 goto :loop
00C2 000351
00C2 0008 000352 return
00C3 000353
00C3 000354
00C3 000355
00C3 000356
00C3 000357
00C3 000358
00C3 30F9 000359 AHshake movlw 11111001b ;bit1 = ADAT = output
00C4 0065 000360 tris RA
00C5 000361
00C5 1085 000362 bcf ADAT ;clr Amiga data line
00C6 000363
00C6 3028 000364 movlw 40
00C7 008C 000365 movwf count0 ;40 * 3 = 120cycles = 120 µs (min 75µs)
00C8 0B8C 000366 :do_it decfsz count0,f
00C9 28C8 000367 goto :do_it
00CA 000368
00CA 30FB 000369 movlw 11111011b ;bit1 = ADAT = input
00CB 0065 000370 tris RA
00CC 0008 000371 return
00CD 000372
00CD 000373
00CD 000374
00CD 000375
00CD 000376
00CD 000377
00CD 1805 000378 wACLK btfsc ACLK ;wait for neg clock pulse
00CE 28CD 000379 goto wACLK
00CF 000380
00CF 1C85 000381 btfss ADAT
00D0 1003 000382 bcf c
00D1 1885 000383 btfsc ADAT
00D2 1403 000384 bsf c ;mov the data to carry bit
00D3 000385
00D3 1C05 000386 wACLK2 btfss ACLK ;wait for pos clock pulse
00D4 28D3 000387 goto wACLK2
00D5 0008 000388 return
00D6 000389
00D6 000390
00D6 000391
00D6 000392
00D6 000393
00D6 000394
00D6 000395
00D6 20E7 000396 sendb call wbit ;this are stop bits from previous sending
00D7 20E7 000397 call wbit
00D8 000398
00D8 1505 000399 bsf TXD ;send startbit
00D9 3008 000400 movlw 8
00DA 008C 000401 movwf count0 ;8 bits to send
00DB 098F 000402 comf serbuf,f ;invert serbuf
00DC 000403
00DC 20E7 000404 s_it call wbit
00DD 0C8F 000405 rrf serbuf,f
00DE 000406
00DE 1C03 000407 btfss c
00DF 1105 000408 bcf TXD
00E0 1803 000409 btfsc c
00E1 1505 000410 bsf TXD
00E2 000411
00E2 0B8C 000412 decfsz count0,f
00E3 28DC 000413 goto s_it ;all bits send ? decrement the bitcounter
00E4 000414
00E4 20E7 000415 call wbit
00E5 1105 000416 bcf TXD ;clear TXD, stopbit, lenght is defined by
00E6 000417 ;next sending
00E6 0008 000418 return
00E7 000419
00E7 000420
00E7 000421
00E7 000422
00E7 000423
00E7 300D 000424 wbit movlw 13
00E8 008D 000425 movwf count1 ;19200 at 4 Mhz
00E9 0B8D 000426 :loop decfsz count1,f
00EA 28E9 000427 goto :loop
00EB 0000 000428 nop
00EC 0008 000429 return
00ED 000430
Used Symbols
-----------------------------------------
PortA 00000005
PortB 00000006
pcl 00000002
RA 00000005
count0 0000000C
count1 0000000D
Akeydat 0000000E
serbuf 0000000F
rawkeys 00000005
Reset 00000088
check 00000089
dat 00000092
ready 0000009F
rcADAT 000000A0
sync 000000B2
wms 000000BA
AHshake 000000C3
wACLK 000000CD
wACLK2 000000D3
sendb 000000D6
s_it 000000DC
wbit 000000E7
Used Defines
-----------------------------------------
c 3,0
z 3,2
TXD PortA,2
ADAT PortA,1
ACLK PortA,0
PROGRAM MEMORY USAGE TABLE: '-' = not used 'X' = used
0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX--- ----------------
0100 : ---------------- ---------------- ---------------- ----------------
0140 : ---------------- ---------------- ---------------- ----------------
0180 : ---------------- ---------------- ---------------- ----------------
01C0 : ---------------- ---------------- ---------------- ----------------
0200 : ---------------- ---------------- ---------------- ----------------
0240 : ---------------- ---------------- ---------------- ----------------
0280 : ---------------- ---------------- ---------------- ----------------
02C0 : ---------------- ---------------- ---------------- ----------------
0300 : ---------------- ---------------- ---------------- ----------------
0340 : ---------------- ---------------- ---------------- ----------------
0380 : ---------------- ---------------- ---------------- ----------------
03C0 : ---------------- ---------------- ---------------- ----------------
Program Memory Words Used: 0237
Program Memory Words Free: 0787
Errors: 0